L.Draw = L.Draw || {};

/**
 * @class L.Draw.Feature
 * @aka Draw.Feature
 */
L.Draw.Feature = L.Handler.extend({

    // @method initialize(): void
    initialize: function (map, options) {
        this._map = map;
        this._container = map._container;
        this._overlayPane = map._panes.overlayPane;
        this._popupPane = map._panes.popupPane;

        // Merge default shapeOptions options with custom shapeOptions
        if (options && options.shapeOptions) {
            options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
        }
        L.setOptions(this, options);

        var version = L.version.split('.');
        //If Version is >= 1.2.0
        if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
            L.Draw.Feature.include(L.Evented.prototype);
        } else {
            L.Draw.Feature.include(L.Mixin.Events);
        }
    },

    // @method enable(): void
    // Enables this handler
    enable: function () {
        if (this._enabled) {
            return;
        }

        L.Handler.prototype.enable.call(this);

        this.fire('enabled', {handler: this.type});

        this._map.fire(L.Draw.Event.DRAWSTART, {layerType: this.type});
    },

    // @method disable(): void
    disable: function () {
        if (!this._enabled) {
            return;
        }

        L.Handler.prototype.disable.call(this);

        this._map.fire(L.Draw.Event.DRAWSTOP, {layerType: this.type});

        this.fire('disabled', {handler: this.type});
    },

    // @method addHooks(): void
    // Add's event listeners to this handler
    addHooks: function () {
        var map = this._map;

        if (map) {
            L.DomUtil.disableTextSelection();

            map.getContainer().focus();

            this._tooltip = new L.Draw.Tooltip(this._map);

            L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
        }
    },

    // @method removeHooks(): void
    // Removes event listeners from this handler
    removeHooks: function () {
        if (this._map) {
            L.DomUtil.enableTextSelection();

            this._tooltip.dispose();
            this._tooltip = null;

            L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
        }
    },

    // @method setOptions(object): void
    // Sets new options to this handler
    setOptions: function (options) {
        L.setOptions(this, options);
    },

    _fireCreatedEvent: function (layer) {
        this._map.fire(L.Draw.Event.CREATED, {layer: layer, layerType: this.type});
    },

    // Cancel drawing when the escape key is pressed
    _cancelDrawing: function (e) {
        if (e.keyCode === 27) {
            this._map.fire('draw:canceled', {layerType: this.type});
            this.disable();
        }
    }
});